/**
 * @brief 控制台颜色模块 - 实现文件
 * 
 * 该模块封装了Windows控制台颜色设置API，支持设置和重置控制台文本及背景颜色。
 */
#include <stdio.h>
#include <windows.h>
#include <wchar.h>
#include "..\..\include\console\console_color.h"

/**
 * @brief 保存默认控制台属性，用于后续重置操作
 */
static WORD defaultAttributes = 0;

/**
 * @brief 控制台输出句柄
 */
static HANDLE hConsole = NULL;

/**
 * @brief 设置控制台文本和背景颜色
 * 
 * 该函数将指定的文本颜色和背景颜色组合应用到控制台输出。
 * 如果是首次调用，会自动初始化并保存默认控制台属性。
 * 
 * @param textColor 文本颜色值（0-15），使用预定义的颜色常量
 * @param backgroundColor 背景颜色值（0-240），使用预定义的颜色常量
 * 
 * @note 文本颜色使用低4位（0x0F），背景颜色使用高4位（0xF0）
 * @warning 颜色值超出范围会被自动截断
 */
void SetConsoleColor(int textColor, int backgroundColor) {
    if (hConsole == NULL) {
        // 获取控制台输出句柄并保存默认属性
        hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        GetConsoleScreenBufferInfo(hConsole, &csbi);
        defaultAttributes = csbi.wAttributes;
    }
    
    // 确保颜色值在有效范围内
    textColor = textColor & 0x0F;           // 文本颜色掩码（低4位）
    backgroundColor = backgroundColor & 0xF0; // 背景颜色掩码（高4位）
    
    // 组合文本和背景颜色
    WORD attributes = (WORD)(textColor | backgroundColor);
    SetConsoleTextAttribute(hConsole, attributes);
}

/**
 * @brief 重置控制台颜色为初始状态
 * 
 * 该函数将控制台颜色恢复为首次调用SetConsoleColor时保存的默认颜色。
 */
void ResetConsoleColor() {
    if (hConsole != NULL && defaultAttributes != 0) {
        SetConsoleTextAttribute(hConsole, defaultAttributes);
    }
}

/**
 * @brief 以指定颜色打印字符串（ANSI字符）
 * 
 * 该函数临时设置控制台文本颜色，打印字符串后恢复默认颜色。
 * 
 * @param textColor 文本颜色值（0-15）
 * @param text 要打印的字符串
 * 
 * @note 背景颜色固定为白色（WHITE_BG）
 */
void ColorfulPrintString(int textColor, char* text) {
    SetConsoleColor(textColor, WHITE_BG);
    printf("%s", text);
    SetConsoleColor(BLACK_TEXT, WHITE_BG);
}

/**
 * @brief 以指定颜色打印宽字符
 * 
 * 该函数临时设置控制台文本颜色，打印宽字符后恢复默认颜色。
 * 
 * @param textColor 文本颜色值（0-15）
 * @param ch 要打印的宽字符
 * 
 * @note 背景颜色固定为白色（WHITE_BG）
 */
void ColorfulPrintWchar(int textColor, wchar_t ch) {
    SetConsoleColor(textColor, WHITE_BG);
    putwchar(ch);
    SetConsoleColor(BLACK_TEXT, WHITE_BG);
}